<?php

class Application_Model_ApostaMapper
{
    protected $_dbTabelaAposta;

    public function setTabelaAposta($tabelaBD)
    {
        if(is_string($tabelaBD)){
            $tabelaBD = new $tabelaBD();
        }
        if (!$tabelaBD instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Tabela invalida');
        }
        $this->_dbTabelaAposta = $tabelaBD;
        return $this;
    }

    public function getTabelaAposta()
    {
        if (null == $this->_dbTabelaAposta) {
            $this->setTabelaAposta('Application_Model_DbTable_Aposta');
        }
        return $this->_dbTabelaAposta;
    }

    public function inserir(Application_Model_Aposta $aposta)
    {
        /*
         * metodo de insercao de aposta no banco
         */
        $dados = array(
            'email_usuario' =>  $aposta->getEmailUsuario(),
            'id_jogo'       =>  $aposta->getIdJogo(),
            'id_bolao'      =>  $aposta->getIdBolao(),
            'placar_parcial'=>  $aposta->getPlacarParcial(),
            'gols_time_a'   =>  $aposta->getGolsTimeA(),
            'gols_time_b'   =>  $aposta->getGolsTimeB(),
            'ordem_de_gols' =>  $aposta->getOrdemGols()

        );
        
        return $tabela = $this->getTabelaAposta()->insert($dados);
    }

    public function remover(Application_Model_Aposta $aposta)
    {
        $email_usuario = $aposta->getEmailUsuario();
        $id_jogo = $aposta->getIdJogo();
        $id_bolao = $aposta->getIdBolao();

        // Valor da aposta
        $valor = 500;

        // Pega o usuário
        $usuarioMapper = new Application_Model_UsuarioMapper();
        $usuario = new Application_Model_Usuario(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        $usuarioMapper->find($email_usuario, $usuario);

        // Pega o e-mail do criador do bolão
        $bolaoMapper = new Application_Model_BolaoMapper();
        $bolao = $bolaoMapper->findBolao($id_bolao);
        $email_criador = $bolao->get_email_criador();

        // Pega o jogo
        $jogoMapper = new Application_Model_JogoMapper();
        $jogo = $jogoMapper->fetch($id_jogo);

        // Testa se a data atual é anterior a data do jogo.
        // Se não, retorna NULL.
        $data_jogo = $jogo->getData();
        $data_atual = new Zend_Date();
        if ($data_atual->isLater($data_jogo)) {
            return NULL;
        }

        // Monta o comando SQL para apagar a linha da tabela Aposta. 
        $tabela_aposta = $this->getTabelaAposta();
        $aposta = $tabela_aposta->getAdapter()->quoteInto('email_usuario = ?', $email_usuario);
        $aposta = $tabela_aposta->getAdapter()->quoteInto('id_jogo = ?', $id_jogo);
        $aposta = $tabela_aposta->getAdapter()->quoteInto('id_bolao = ?', $id_bolao);

        // Iniciando mudanças atômicas no banco
        $db = $this->getTabelaAposta()->getAdapter();
        try {
            $db->beginTransaction();

            $usuario->setBolitos($usuario->getBolitos() + $valor);
            $usuarioMapper->save($usuario);

            // Se for bolão de usuário, cria linha na tabela ParticipantesBolao
            if ($email_criador) {
                $pendenteMapper = new Application_Model_ParticipantesBolaoMapper();
                $pendente = new Application_Model_ParticipantesBolao($id_bolao, $email_usuario);
                $pendenteMapper->inserir($pendente);
            }

            $tabela_aposta->delete($aposta);

            return $db->commit();        

        } catch (Zend_Db_Exception $ex) {
            $db->rollBack();
            throw $ex;
        }
    }

    public function salvar(Application_Model_Aposta $aposta)
    {
        $dados = array(
              'email_usuario'   => $aposta->getEmailUsuario(),
        	  'id_jogo'         => $aposta->getIdJogo(),
    	      'id_bolao'        => $aposta->getIdBolao(),
              'placar_parcial'  => $aposta->getPlacarParcial(),
        	  'gols_time_a'     => $aposta->getGolsTimeA(),
    	      'gols_time_b'     => $aposta->getGolsTimeB(),
        	  'ordem_de_gols'   => $aposta->getOrdemGols()
        );

        $tabela = $this->getTabelaAposta();
        $select = $tabela->find($dados['email_usuario'], $dados['id_jogo'], $dados['id_bolao']);


        if (count($select) == 0) {
          return $this->getTabelaAposta()->insert($dados);
        } else {
          return $this->getTabelaAposta()->update($dados, array('email_usuario = ?' => $dados['email_usuario'], 'id_jogo = ?' => $dados['id_jogo'], 'id_bolao = ?' => $dados['id_bolao']));
        }
    }

    /**
     *
     * @param <type> $id_jogo
     * @param <type> $id_bolao
     * @return <type> tabela contendo todas os apostadores de um bolão referente a um jogo
     */
    public function localizarApostaBolao($id_bolao)
    {
        $tabela = $this->getTabelaAposta();

        $select = $tabela->select();
        $select->from($tabela, array('email_usuario', 'placar_parcial', 'gols_time_a', 'gols_time_b', 'ordem_de_gols'))
                ->where('id_bolao = ?', $id_bolao);

        return $tabela->fetchAll($select);
    }

    /**
     *
     * @param <type> $id_jogo
     * @return <type> todos os boloes de um jogo.
     */
    public function localizarAposta($id_jogo)
    {

        $tabela = $this->getTabelaAposta();

        $select = $tabela->select();
        $select->from($tabela, 'id_bolao')
               ->distinct()
               ->where('id_jogo = ?', $id_jogo);

        return $tabela->fetchAll($select);
    }

    public function localizarOrdemDeGols($email_usuario, $id_jogo, $id_bolao)
    {
        $tabela = $this->getTabelaAposta();

        $select = $tabela->find($email_usuario, $id_jogo, $id_bolao);

        if(count($select) == 0)
            return;

        $linha = $select->current();
        return $linha->ordem_de_gols;
    }

    public function localizarApostadorBolao($apostador, $id_jogo, $id_bolao){
        $tabela = $this->getTabelaAposta();

        if($apostador == NULL) return NULL;

        if($id_jogo == NULL){
            $bolaoMapper = new Application_Model_BolaoMapper();
            $id_jogo = $bolaoMapper->findBolao($id_bolao)->get_id_jogo();
        }

        $select = $tabela->find($apostador, $id_jogo, $id_bolao);
        if(count($select) == 0)
            return NULL;

        $row = $select->current();
        $aposta = new Application_Model_Aposta($row->email_usuario, $row->id_jogo, $row->id_bolao, $row->placar_parcial, $row->gols_time_a, $row->gols_time_b, $row->ordem_de_gols);

        return $aposta;
    }

    public function localizaApostasUsuario($email)
    {
        $tabela = $this->getTabelaAposta();

        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('email_usuario = ?', $email);

        return $tabela->fetchAll($select);
    }

    public function apostasEmBolao($id){
        $tabela = $this->getTabelaAposta();
        $busca = $tabela->select();
        $busca->from($tabela, '*')
                ->where('id_bolao = ?', $id);
        $resultado = $tabela->fetchAll($busca);
        $nro = count($resultado);
        return $nro;
    }

    public function usuarioApostas($email){
        $tabela = $this->getTabelaAposta();
        $select = $tabela->select();
        $select->from($tabela, '*')
               ->where('email_usuario = ?', $email);
        $busca = $tabela->fetchAll($select);
        if(count($busca) == 0)
            return;
        $resultado = array();
        foreach ($busca as $atual)
        {
            $resultado[] =  $atual['id_bolao'];
        }

        return $resultado;
    }

}
